package com.mashibing.api.filter.impl;

import com.mashibing.api.client.BeaconCacheClient;
import com.mashibing.api.filter.CheckFilter;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.enums.ExceptionEnums;
import com.mashibing.common.exception.ApiException;
import com.mashibing.common.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
 * @author SNA
 * @date 2025/5/7
 * @Description 校验请求的ip地址是否是白名单
 **/
@Service(value = "ip")
@Slf4j
public class IPCheckFilter implements CheckFilter {

    @Autowired
    private BeaconCacheClient beaconCacheClient;

    private final String IP_ADDRESS = "ipAddress";

    @Override
    public void check(StandardSubmit submit) {
        log.info("【接口模块-校验ip】   校验ing.........");

        //1. 根据CacheClient根据客户的apikey以及ipAddress去查询客户的IP白名单
        List<String> ip = (List<String>) beaconCacheClient.hget(CacheConstant.CLIENT_BUSINESS + submit.getApikey(), IP_ADDRESS);
        submit.setIp(ip);
        log.info("【接口模块-校验ip】   白名单IP: {}, 客户端IP: {}", ip, submit.getRealIP());


        //2. 如果IP白名单为null，直接放行
        // 如果客户未设置ip白名单，则默认为所有ip地址都合法
        // 如果设置了白名单，才需要去做一个校验
        if (CollectionUtils.isEmpty(ip) || ip.contains(submit.getRealIP())) {
            log.info("【接口模块-校验ip】   客户端请求IP合法！");
            return;
        }

        //3. 判断IP白名单不为null，并且客户端请求不在IP白名单内
        log.info("【接口模块-校验ip】   请求的IP不在白名单内！");
        throw new ApiException(ExceptionEnums.IP_NOT_WHITE);

    }
}
